package main

import (
	"fmt"
	"strconv"
)

func div(a, b int) int {
	return a / b
}

// 错误和异常 错误就是可以预先知道的出错可能，这个时候我们把这种情况叫做错误，不可预知的问题叫做异常
// 程序写的不严谨造成的问题产生异常
func main() {
	data := 12
	strconv.Itoa(data)           // go 认为这个Itoa函数不能能出错，没有必要饭不会error，内部出错的时候应该抛出panic
	i, err := strconv.Atoi("12") // Atoi 这个函数内部会返回error，预知到可能会出错，所以返回两个值
	// go 语言中会有大量的err != nil 来判断是否出错，遍地都是，不是太爽
	if err != nil {
		// pass
		fmt.Println(err.Error())
	} else {
		fmt.Println(i)
	}

	// go 语言中如何抛出异常
	a := 12
	b := 0
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("捕捉到异常了")
		}
	}()
	fmt.Println(div(a, b))
	// panic 会引起主线程挂掉，同时会影响其他协程挂掉
	// 在父协程中无法捕获子协程的异常
	// go 语言认为错误就需要自己处理
}
